#include<iostream>
#include<unistd.h>
#include<pthread.h>
#include<string>
#include<cstring>
#include<thread>
#include<ctime>
#define NUM 10

using namespace std;
// class ThreadData
// {
// public:
//     ThreadData(const string &name, int id, time_t createTime, int top)
//     :_name(name), _id(id), _createTime((uint64_t)createTime),_status(OK), _top(top), _result(0)
//     {}
//     ~ThreadData()
//     {}
// public:
//     // 输入的
//     string _name;
//     int _id;
//     uint64_t _createTime;
//     // 返回的
//     int _status;
//     int _top;
//     int _result;
//     // char arr[n]
// };
// void *thread_run(void *args)
// {
//     char*name=(char*)args;
//     while(true)
//     {
//         cout<<"new thread running:"<<name<<endl;
//         sleep(1);
//         break;
//     }
//     delete name;
//     pthread_exit((void*)1);
//     //return nullptr;
// }
// int main()
// {
//     pthread_t tids[NUM];
//     for(int i=0;i<NUM;i++)
//     {
//         char *tname=new char[64];
//         snprintf(tname,64,"thread-%d",i+1);
//         ThreadData *td=new ThreadData(tname,i+1,time(nullptr));
//         pthread_create(tids+i,nullptr,thread_run,tname);
//     }
//     for(int i=0;i<NUM;i++)
//     {
//         pthread_join(tids[i],nullptr);
//     }
//     cout<<"all thread quit ..."<<endl;
//     return 0;
//     //while(true)
//     //{
//       //  cout<<"new thread running,new thread id:"<<endl;
//        // sleep(1);
//     //}
// }
string hexAddr(pthread_t tid)
{
    char buffer[24];
    snprintf(buffer,sizeof(buffer),"0x%x",tid);
    return buffer;
}
void *thread_run(void *args)
{
    // char*name=(char*)args;
    // while(true)
    // {
    //     cout<<"new thread running:"<<name<<endl;
    //     sleep(1);
    //     break;
    // }
    // delete name;
    // pthread_exit((void*)1);
    //return nullptr;

    const char*name=static_cast<const char*>(args);
    int cnt=5;
    while(cnt)
    {
        cout<<name<<":"<<cnt--<<hexAddr(pthread_self())<<endl;
        sleep(1);
    }
    // pthread_exit((void*)11);
    return nullptr;
}
int main()
{
    pthread_t tid;
    pthread_create(&tid,nullptr,thread_run,(void*)"thread 1");
    
    while(true)
    {
        cout<<"main thread:"<<hexAddr(pthread_self())<<" "<<"new thread id:"<<hexAddr(tid)<<endl;
        sleep(1);
    }

    int n=pthread_join(tid,nullptr);
    if(0!=n)
    {
        cerr<<"error:"<<n<<":"<<strerror(n)<<endl;
    }

    // void *ret=nullptr;
    // pthread_join(tid,&ret);
    // cout<<"new thread exit:"<<(int64_t)ret<<endl;
    return 0;
}
// int main()
// {
//     char* tmp;
//     cout<<sizeof(tmp)<<endl;
//     return 0;
// }